package com.rtos.model.process.processDispatchAlgorithm;

import com.rtos.model.cpu.CPU;
import com.rtos.model.process.ProcessDispatcher;

import java.util.Random;

/**
 * @Author: biubiu0002
 * @Date: 2021-10-27 19:14
 * 分配一个线程专门用来操作 执行进程调度。
 **/
public abstract class AbstractProcessDispatcher implements ShortTermSchedulingStrategy {


    protected ProcessDispatcher processDispatcher = ProcessDispatcher.getInstance();



    /**
     * 模板方法设计模式 模仿AQS
     * 需要子类重写调度算法processDispatchAlgorithm()
     * 提供模板方法doDispatch()公开调用
     */


    @Override
    public abstract void processDispatchAlgorithm();

    /**
     * 无参构造方法 供子类调用
     */
    public AbstractProcessDispatcher() {}

    public synchronized void doDispatch(){
        try {
            if(CPU.psw[0]==0&&CPU.psw[1]==0&&CPU.psw[2]==0){
                /**
                 * 经过CPU的 进程结束/时间片结束/IO结束 中断处理后，运行队列总是不为空，要么是一般进程，要么是闲逛进程。
                 */
                //每秒有5%的概率创建一个线程
//                System.out.println("10%的几率创建一个进程");
                int i = new Random().nextInt(100);
                if(i>=95){
//                    System.out.println("创建一个进程");
                    processDispatcher.create();
                }
                processDispatchAlgorithm();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
        }
    }
}
